import { Injectable } from '@nestjs/common';
import { CreateScenarioDto } from './dto/create-scenario.dto';
import { UpdateScenarioDto } from './dto/update-scenario.dto';
import { PrismaService } from 'src/prisma/prisma.service';

@Injectable()
export class ScenarioService {
  constructor( private prisma : PrismaService){

  }

  async create(createScenarioDto: CreateScenarioDto) {
    const res = await  this.prisma.testScenario.create({
      data:createScenarioDto
    })
     return res;
  }

  async findOneByScenario(secnario:string){
    return await this.prisma.testScenario.findFirst({
      where:{
        scenario:secnario
      }
    })
  }

  async scenarioIsExists(secnario:string, id:number){
    return await this.prisma.testScenario.findFirst({
      where:{
        // scenario相同 id 不同的数据
        scenario:secnario,
        NOT:{
          id
        }
      }
    })
  }


   findAll() {
    return this.prisma.testScenario.findMany({
      orderBy:{
        id:'asc'
      }
    });
  }

  //根据分页查询数据
  async findByPages(skip:number, take:number){
    return await this.prisma.testScenario.findMany({
      include:{
        _count:{
                select:{cases:true}
              }
      },
      skip:skip,
      take:take
    })
  }

  async findTotal(){
    return await this.prisma.testScenario.count();
  }


  async findOne(id: number) {
     return  await this.prisma.testScenario.findFirst({
      where:{id},
      include:{
        preActions:true
      }
     })
  }
  
  //根据关键字匹配数据
  async searchByKey(key:string){
    return  await this.prisma.testScenario.findMany({
      where:{
        OR:[
          {scenario:{contains:key}},
          {description:{contains:key}},
        ]
      },
     })
  }

  async update(id: number, updateScenarioDto: UpdateScenarioDto) {
    return  await this.prisma.testScenario.update({
      where:{id},
      data: updateScenarioDto
    })
  }

  async remove(id: number) {
    const cases = await this.prisma.testCases.findMany({
      where:{
        sid:id
      }
    })
    // console.log("cases---", cases)
    if(cases.length >0){
      await this.prisma.testCases.deleteMany({
        where:{
          sid:id
        }
      })
    }
    return  await this.prisma.testScenario.delete({
      where:{id}
    })
  }

  async copy(id:number){
    // 第一步 , 先查询旧的scenario;
    const  data = await this.prisma.testScenario.findUnique({
      where:{id}
    })
    const { scenario, description } = data;
    const new_data = await this.prisma.testScenario.create({
      data:{
        scenario: scenario + ' copy',
        description
      }
    });
    const testCases = await this.prisma.testCases.findMany({
      where:{
        sid:id
      }
    })

    for(let c of testCases){
       c.sid = new_data.id;
       delete c.id;
       await this.prisma.testCases.create({
        data:c
       })
    }

  }

  // 设定前置操作
  async setPreActions(sid:number){
    const res =await this.prisma.preActions.findFirst({
      where:{sid}
    })
    // console.log("res---", res);
    if(res == null){
      // console.log("创建preactions")
      await this.prisma.preActions.create({
        data:{sid:sid}
      })
    }

  }

  async removePreactions(sid:number){
    return await this.prisma.preActions.delete({
      where:{sid:sid}
    })
  }

  async getPreactions(){
    return await this.prisma.preActions.findMany({
      include:{
        scenario:{
          include:{
            cases:true
          }
        }
      }
    })
  }
}
